{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 50000 entries, 0 to 49999\n",
      "Data columns (total 2 columns):\n",
      " #   Column   Non-Null Count  Dtype \n",
      "---  ------   --------------  ----- \n",
      " 0   label    50000 non-null  object\n",
      " 1   content  50000 non-null  object\n",
      "dtypes: object(2)\n",
      "memory usage: 781.4+ KB\n"
     ]
    }
   ],
   "source": [
    "# 1.3.1 导入数据\n",
    "import pandas as pd\n",
    "train_data=pd.read_csv('./cnews/cnews.train.txt',sep='\\t',names=['label','content'])\n",
    "# test_data=pd.read_csv('./cnews/cnews.test.txt',sep='\\t',names=['content'])\n",
    "train_data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1.3.2 将文字型的label 转为数字label\n",
    "def read_category(y_train):\n",
    "    \"\"\"读取分类目录，固定\"\"\"\n",
    "    categories = ['体育', '财经', '房产', '家居', '教育', '科技', '时尚', '时政', '游戏', '娱乐']\n",
    "    categories = [x for x in categories]\n",
    "    cat_to_id = dict(zip(categories, range(len(categories))))\n",
    "    label_id = []\n",
    "    for i in range(len(y_train)):\n",
    "        label_id.append(cat_to_id[y_train[i]])\n",
    "    return label_id\n",
    "    \n",
    "train_target=train_data['label']  \n",
    "y_label=read_category(train_target)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 2.1 Jieba分词\n",
    "import jieba\n",
    "def chinese_word_cut(mytext):  \n",
    "    return \" \".join(jieba.cut(mytext))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 添加分词\n",
    "train_content =train_data['content'].apply(chinese_word_cut)\n",
    "# test_content = test_data['content'].apply(chinese_word_cut)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 336263 unique tokens.\n",
      "Shape of data tensor: (50000, 100)\n",
      "Shape of label tensor: (50000,)\n"
     ]
    }
   ],
   "source": [
    "from keras.preprocessing.text import Tokenizer\n",
    "from keras.preprocessing.sequence import pad_sequences\n",
    "import numpy as np\n",
    "\n",
    "# 在 100 个单词后截断评论\n",
    "maxlen = 100 \n",
    "# 在 200 个样本上训练\n",
    "training_samples = 200 \n",
    "# 在 10 000 个样本上验证\n",
    "validation_samples = 10000 \n",
    "# 只考虑数据集中前 10 000 个最常见的单词\n",
    "max_words = 10000 \n",
    "\n",
    "tokenizer = Tokenizer(num_words=max_words)\n",
    "tokenizer.fit_on_texts(train_content)\n",
    "sequences = tokenizer.texts_to_sequences(train_content)\n",
    "\n",
    "word_index = tokenizer.word_index\n",
    "print('Found %s unique tokens.' % len(word_index))\n",
    "\n",
    "# 将整数列表转换成形状为(samples, maxlen) 的二维整数张量\n",
    "data = pad_sequences(sequences, maxlen=maxlen)\n",
    "\n",
    "labels = np.asarray(y_label)\n",
    "print('Shape of data tensor:', data.shape)\n",
    "print('Shape of label tensor:', labels.shape)\n",
    "\n",
    "# 将数据划分为训练集和验证集，但首先要打乱数据，因为一开始数据中的样本\n",
    "# 是排好序的（所有负面评论都在前面，然后是所有正面评论）\n",
    "indices = np.arange(train_content.shape[0]) \n",
    "np.random.shuffle(indices)\n",
    "data = data[indices]\n",
    "labels = labels[indices]\n",
    "\n",
    "x_train = data[:training_samples]\n",
    "y_train = labels[:training_samples]\n",
    "x_val = data[training_samples: training_samples + validation_samples] \n",
    "y_val = labels[training_samples: training_samples + validation_samples]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Vocab:\n",
    "    def __init__(self, filename, num_word_threshold):\n",
    "        self._word_to_id = {}\n",
    "        self._unk = -1\n",
    "        self._num_word_threshold = num_word_threshold\n",
    "        self._read_dict(filename)\n",
    "    \n",
    "    def _read_dict(self, filename):\n",
    "        with open(filename, 'r', encoding = 'utf-8') as f:\n",
    "            lines = f.readlines()\n",
    "        for line in lines:\n",
    "#             print(line.strip('\\r\\n').split('\\t'))\n",
    "            word, frequency = line.strip('\\r\\n').split('\\t')\n",
    "            frequency = int(frequency)\n",
    "            if frequency < self._num_word_threshold:\n",
    "                continue\n",
    "            idx = len(self._word_to_id)\n",
    "            if word == '<UNK>':\n",
    "                self._unk = idx\n",
    "            self._word_to_id[word] = idx\n",
    "    \n",
    "    def word_to_id(self, word):\n",
    "        return self._word_to_id.get(word, self._unk)\n",
    "    \n",
    "    @property\n",
    "    def unk(self):\n",
    "        return self._unk\n",
    "    \n",
    "    def size(self):\n",
    "        return len(self._word_to_id)\n",
    "    \n",
    "    def sentence_to_id(self, sentence):\n",
    "        word_ids = [self.word_to_id(cur_word) \\\n",
    "                    for cur_word in sentence.split()]\n",
    "        return word_ids"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# import os\n",
    "# dataset_path = './cnews'\n",
    "# vocab_file =  './cnews/cnews.vocab.txt'\n",
    "# vocab = Vocab(vocab_file, 10)\n",
    "# vocab_size = vocab.size()\n",
    "# print('vocab_size: %d' % vocab_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/30\n",
      "2/2 [==============================] - 0s 174ms/step - loss: 2.3026 - accuracy: 0.0750 - val_loss: 2.3018 - val_accuracy: 0.2500\n",
      "Epoch 2/30\n",
      "2/2 [==============================] - 0s 24ms/step - loss: 2.3003 - accuracy: 0.1937 - val_loss: 2.3010 - val_accuracy: 0.3000\n",
      "Epoch 3/30\n",
      "2/2 [==============================] - 0s 23ms/step - loss: 2.2985 - accuracy: 0.2313 - val_loss: 2.2996 - val_accuracy: 0.3000\n",
      "Epoch 4/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 2.2962 - accuracy: 0.2625 - val_loss: 2.2979 - val_accuracy: 0.2500\n",
      "Epoch 5/30\n",
      "2/2 [==============================] - 0s 23ms/step - loss: 2.2939 - accuracy: 0.2438 - val_loss: 2.2963 - val_accuracy: 0.2500\n",
      "Epoch 6/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 2.2914 - accuracy: 0.2250 - val_loss: 2.2948 - val_accuracy: 0.2250\n",
      "Epoch 7/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 2.2886 - accuracy: 0.2313 - val_loss: 2.2931 - val_accuracy: 0.2250\n",
      "Epoch 8/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 2.2856 - accuracy: 0.2313 - val_loss: 2.2914 - val_accuracy: 0.2250\n",
      "Epoch 9/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 2.2820 - accuracy: 0.2438 - val_loss: 2.2897 - val_accuracy: 0.2250\n",
      "Epoch 10/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 2.2782 - accuracy: 0.2562 - val_loss: 2.2881 - val_accuracy: 0.2250\n",
      "Epoch 11/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 2.2737 - accuracy: 0.2625 - val_loss: 2.2868 - val_accuracy: 0.2250\n",
      "Epoch 12/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 2.2683 - accuracy: 0.2937 - val_loss: 2.2852 - val_accuracy: 0.2250\n",
      "Epoch 13/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 2.2621 - accuracy: 0.3313 - val_loss: 2.2829 - val_accuracy: 0.2250\n",
      "Epoch 14/30\n",
      "2/2 [==============================] - 0s 20ms/step - loss: 2.2541 - accuracy: 0.3500 - val_loss: 2.2796 - val_accuracy: 0.2500\n",
      "Epoch 15/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 2.2445 - accuracy: 0.3313 - val_loss: 2.2747 - val_accuracy: 0.2500\n",
      "Epoch 16/30\n",
      "2/2 [==============================] - 0s 20ms/step - loss: 2.2324 - accuracy: 0.3187 - val_loss: 2.2689 - val_accuracy: 0.2500\n",
      "Epoch 17/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 2.2153 - accuracy: 0.3125 - val_loss: 2.2617 - val_accuracy: 0.2500\n",
      "Epoch 18/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 2.1907 - accuracy: 0.3438 - val_loss: 2.2490 - val_accuracy: 0.2750\n",
      "Epoch 19/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 2.1531 - accuracy: 0.3562 - val_loss: 2.2234 - val_accuracy: 0.1750\n",
      "Epoch 20/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 2.0868 - accuracy: 0.1875 - val_loss: 2.1986 - val_accuracy: 0.2250\n",
      "Epoch 21/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 2.0031 - accuracy: 0.3187 - val_loss: 2.1681 - val_accuracy: 0.2250\n",
      "Epoch 22/30\n",
      "2/2 [==============================] - 0s 23ms/step - loss: 1.9558 - accuracy: 0.5375 - val_loss: 2.2118 - val_accuracy: 0.2500\n",
      "Epoch 23/30\n",
      "2/2 [==============================] - 0s 23ms/step - loss: 1.9344 - accuracy: 0.4250 - val_loss: 2.1755 - val_accuracy: 0.2250\n",
      "Epoch 24/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 1.8943 - accuracy: 0.5000 - val_loss: 2.1473 - val_accuracy: 0.2500\n",
      "Epoch 25/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 1.8921 - accuracy: 0.5750 - val_loss: 2.1820 - val_accuracy: 0.2500\n",
      "Epoch 26/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 1.8070 - accuracy: 0.5750 - val_loss: 2.2293 - val_accuracy: 0.2250\n",
      "Epoch 27/30\n",
      "2/2 [==============================] - 0s 22ms/step - loss: 1.7680 - accuracy: 0.4250 - val_loss: 2.1474 - val_accuracy: 0.2500\n",
      "Epoch 28/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 1.7601 - accuracy: 0.4750 - val_loss: 2.1839 - val_accuracy: 0.2500\n",
      "Epoch 29/30\n",
      "2/2 [==============================] - 0s 21ms/step - loss: 1.6929 - accuracy: 0.4437 - val_loss: 2.3191 - val_accuracy: 0.2500\n",
      "Epoch 30/30\n",
      "2/2 [==============================] - 0s 20ms/step - loss: 1.6768 - accuracy: 0.4437 - val_loss: 2.1319 - val_accuracy: 0.2750\n"
     ]
    }
   ],
   "source": [
    "embedding_dim = 16\n",
    "vocab_size = 10000\n",
    "\n",
    "from keras.layers import Embedding, Dense\n",
    "from keras.models import Sequential\n",
    "from keras.layers import LSTM\n",
    "model = Sequential()\n",
    "model.add(Embedding(vocab_size, embedding_dim, input_length = maxlen))\n",
    "model.add(LSTM(units = 32, return_sequences = False))\n",
    "model.add(Dense(32, activation = 'relu'))\n",
    "model.add(Dense(10, activation='softmax'))\n",
    "\n",
    "model.compile(optimizer = 'adam',\n",
    "              loss = 'sparse_categorical_crossentropy',\n",
    "              metrics = ['accuracy'])\n",
    "\n",
    "history = model.fit(x_train, y_train,\n",
    " epochs=30,\n",
    " batch_size=128,\n",
    " validation_split=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Awf6n//8Z3d337hxY837jdGQ4yTSWNOmhe+zWXieNi07ZaMOqPA0ebXgerlkqjnbzc444wxatmwJwJo1axgzZgyLFy/GzNi6dWvKz4wYMYI2bdrQpk0b9t9/f1auXElxcfFOZQYOHFgzr2/fvlRWVtK+fXsOPvjgmn7eo0ePZurUXW/isnXrVi6++GIWLFhAy5Yt+fe//w3AvHnz+M53vkNRosrSsWNH1q1bx4oVKzj11FOBcHGQSKErL8+8l0pDysZZZJtcmrPdrF27djWvr7nmGk466SRef/11Hn300bR9stu0aVPzumXLlinb3zMpk87NN9/MAQccwKuvvkpFRUW9J21FJP4im9Dz1W62Zs0aunbtCsA999yT9eUfdthhLF26lMrKSgAefDD1zenXrFlDly5daNGiBffffz/bt28H4Atf+AJ33303GxL9uD766CM6dOhAcXExs2bNAmDz5s0174tIfEQ2oZeXw9SpUFICZuF56tTc/+y64ooruOqqq+jXr1+DatSZ2nPPPbn99tsZNmwYAwYMoEOHDuy99967lLvwwgu599576dOnD2+99VbNr4hhw4YxcuRIysrK6Nu3L1OmTAHg/vvv59Zbb+Woo45i8ODBfPDBB1mPXUTyK2/3FC0rK/PaN7h48803Ofzww/MSTyFZv3497du3x9256KKLOPTQQxk/fny+w6qh4ySSP2b2kruXpXovsjX0OPv9739P3759OeKII1izZg3nnXdevkMSkQiIbC+XOBs/fnxB1chFJBpUQxcRiQkldBFJS8PSRouaXEQkJQ1LGz2qoYtIShqWNnqU0JOcdNJJPP744zvNu+WWW7jgggvSfmbIkCFUd7/88pe/zCeffLJLmYkTJ9b0B09n1qxZvPHGGzXTP/nJT5g3b14DohfJLg1LGz1K6ElGjx7NjBkzdpo3Y8YMRo8endHn58yZwz777NOodddO6JMmTWLo0KGNWpZINmhY2uhRQk9y+umn89e//rVmXJTKykree+89jj/+eC644ALKyso44ogjuPbaa1N+vrS0lP/+978ATJ48mR49enDcccfVDLELoY/50UcfTZ8+ffja177Ghg0beP7555k9ezaXX345ffv25e2332bs2LE89NBDADzxxBP069eP3r17c/bZZ7N58+aa9V177bX079+f3r1789Zbb+0Sk4bZlcbS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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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X1LJeuSRUL/nn0/+tStWhMHQc89N/rVVbd0autTGj69fPlEpneWSqpsCujRV6exDr66y0v2660IZP/iB+3ff7ZwmGvQuv7xuZfzyl+H1V1+d2qC+Zo37oEHuLVu6z5lTtzz+/e8w9XL48OTLLioKA8BvvFG3sqsaONB92LD65+OugC7S6DT0nPW77gplDRoUWp5R8+eHL5Ojjqp7X3hlpftll4VocvPNqalvRUXoAmrRwn3q1PrlNWFCOPbFixNLv359CL7Nm4cB4FQYOzbMQErFF54Cuoj41Kmhxdmjh/snn4SpfT16uO+7b/1PFtq61f2CC0JE+elPa59WGM+6de5Dh4aA+sQT9auXu/unn4YB4muvrT3tpk3hl4xZar9k77orvDeffVb/vBTQRcTdw9mVe+4Zgvj3vheC5syZqcl7yxb3K68MUeX4491XrUo+j+++cz/uuBCAH300NfVydz/jjDA/P97Uwa1bw0lEEAJwKs2aFfJ99tn65xUvoGtxLpEm5Kij4LXXoGVLePnlsGLh0UenJu/mzeG22+Avfwlrkw8cmNwqjRs3hoW1pk+HBx+E885LTb0ALrssrO8S6xJ17jB+PDz8MNxyS1gPJpWia7qkfW30WJE+3Te10EUy54svwpzudMxMcXd/7bUwQ2T33d3//vfa02/cGKZZmrnff3/q67N1a+heGjiw5v033BBa0Fdemb73pHv3+s+YcVcLXSRrpfKydlV16gTnnLPzSoWpMmQIzJ4drvB0yinw3/8de03wTZvCMrh//3tYPXH06NTXp1mz0Op++22YM2fHff/1X3DzzfAf/xF+saTrPenTpwFWXYwV6dN9UwtdJL6GnN6YLhUVof8a3C+6KEwjrGrTJvczzwz777knvXX59tvw/lU9QSm6kuKIEek9Ocrd/cYbw9hAfZdLQIOiItmnoU5ASretW7efuj906PZpk5s3h0AK7v/zPw1Tl4svDuu7rFoVTslv1sz9hBNSt+xwPE895SlZATJeQFeXi0gjle7L2jWUZs3CQGNpaejyGDAgXHXpggvgySfh9tvhP/+zYeryk5+EwddLLgkXyRg0CKZOhVat0l92Q1zsokX6shaR+ujWDZYurXl7Njr/fDjwwDCT5fDDw++N3/8errii4epQWAiDB4fZLn36wLPPQtu2DVP2/vuHC1mnc6aLWugijVRD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s2HDBkaMGMGvfvWrnV5fUFBAWVkZHTp0YNKkSTz44IPsvffedO3alf79+wNhjnlJSQmbNm3iwAMP5KGHHqK8vJxp06YxY8YMbrnlFp566iluvvlmhg8fzogRI3j55Ze56qqr2LJlCwMGDOCee+6hVatWFBQUMGrUKJ555hk2b97ME088Qa9evWIe36pVqxgzZgyffPIJbdq0oaSkhD59+jBjxgzGjx8PhEvLzZw5k3Xr1nHuueeydu1atmzZwj333MPRRx9dn7dfJOfEW8Y7E2upp3KWy3lkcXcLwF577cURRxzB888/D4TW+TnnnIOZMWnSJMrKypg3bx4zZszYtuZ4TebMmcOUKVMoLy/nueeeY/bs2dv2nXXWWcyePZv33nuP3r17M3nyZAYPHsxpp53GrbfeSnl5OQcccMC29Bs3bmT06NE89thjvP/++9uCa1SHDh2YO3cul156aa3dOtFldufNm8dvfvMbLrzwQoBty+yWl5cza9Ysdt11Vx555BFOPPFEysvLee+997Qqo0gNGtvFpFPSQjez3YFjgB+lIj+I35JOp2i3y+mnn86UKVOYPHkyAI8//jglJSVs2bKF5cuXs2DBAvr06VNjHrNmzeLMM8+kTWQ5yNNOO23bvvnz53P99dezevVq1q1bx4knnhi3Ph9++CHdu3enR48eAIwaNYq77rqLyy+/HAhfEAD9+/dn6tSpcfPSMrsiqdWQy3gnIpFpi48CbwI9zWyZmf2HmY0zs3FVkp0JvODu36Wrog3l9NNP5+WXX2bu3LmsX7+e/v37s3jxYm677TZefvll5s2bx6mnnhpz2dzajB49mj/96U+8//773HTTTXXOJyq6BG99lt/VMrsidZPsMt7pHkBNZJbLSHfv5O4t3b2Lu09293vd/d4qaR5w9/NSW7XMyMvL49hjj2XMmDHbBkPXrl1L27Zt2X333fnqq6+2dcnEMnToUJ5++mk2bNhARUUFzzzzzLZ9FRUVdOrUic2bN29b8hagXbt2VFRU7JRXz549WbJkCR9//DEADz30EMccc0ydjk3L7IqkVjLLeDfEAKrWcqnByJEjOfPMM7fNeOnbty/9+vWjV69edO3alSFDhsR9/eGHH865555L37592XvvvXdYAvfmm29m4MCBdOzYkYEDB24L4ueddx4XX3wxd955J08++eS29K1bt+b+++/n7LPP3jYoOm7cuJ3KTISW2RVJvUSX8W6IAVQtnyt1ps9LJHHNmoWWeXVmUFmZeD5aPldEJMNiDZSmcgBVAV1EpAE0xHWQG11Az1QXkCRHn5NIchriOsiNalC0devWrFy5kvbt22Nmma6OxODurFy5ktatW2e6KiJZJd3XQW5UAb1Lly4sW7aMxrjOi+yodevWdOnSJdPVEJEqGlVAb9myJd27d890NUREslKj60MXEZG6UUAXEckRCugiIjkiY2eKmtkKoPo6ZR2AbzJQnXTJteOB3DumXDseyL1jyrXjgfodU767d6xpR8YCek3MrCzWKa3ZKNeOB3LvmHLteCD3jinXjgfSd0zqchERyREK6CIiOaKxBfSSTFcgxXLteCD3jinXjgdy75hy7XggTcfUqPrQRUSk7hpbC11EROpIAV1EJEc0ioBuZieZ2Ydm9rGZ/SLT9UkFM1tiZu+bWbmZldX+isbHzP5iZl+b2fwq2/YysxfN7KPI/Z6ZrGMyYhzPRDP7PPI5lZvZKZmsYzLMrKuZTTezBWb2gZmNj2zP5s8o1jFl5edkZq3N7B0zey9yPL+KbO9uZm9HYt5jZrZLSsrLdB+6mTUH/gl8H1gGzAZGuvuCjFasnsxsCVDk7ll7QoSZDQXWAX9190Mj2/4ArHL330W+fPd092szWc9ExTieicA6d78tk3WrCzPrBHRy97lm1g6YA5wBjCZ7P6NYx3QOWfg5WVgHvK27rzOzlsBrwHjg58BUd59iZvcC77n7PfUtrzG00I8APnb3T9x9EzAFOD3DdRLA3WcCq6ptPh14MPL4QcI/W1aIcTxZy92Xu/vcyOMKYCHQmez+jGIdU1byYF3kacvIzYHjgOjV4FP2GTWGgN4Z+KzK82Vk8QdYhQMvmNkcMxub6cqk0D7uvjzy+Etgn0xWJkX+08zmRbpksqZ7oiozKwD6AW+TI59RtWOCLP2czKy5mZUDXwMvAv8CVrv7lkiSlMW8xhDQc9VR7n44cDJwWeTnfk7x0F+X7fNe7wEOAAqB5cAfM1qbOjCzPOAp4HJ3X1t1X7Z+RjUcU9Z+Tu6+1d0LgS6EHole6SqrMQT0z4GuVZ53iWzLau7+eeT+a+B/CR9kLvgq0s8Z7e/8OsP1qRd3/yryD1cJ3EeWfU6RftmngFJ3nxrZnNWfUU3HlO2fE4C7rwamA0cCe5hZ9AJDKYt5jSGgzwYOioz67gKcB0zLcJ3qxczaRgZ0MLO2wAnA/PivyhrTgFGRx6OAv2WwLvUWDXwRZ5JFn1NkwG0ysNDdb6+yK2s/o1jHlK2fk5l1NLM9Io93JUz+WEgI7CMiyVL2GWV8lgtAZArSHUBz4C/uPimzNaofM9uf0CqHcJm/R7LxmMzsUWAYYanPr4CbgKeBx4FuhOWPz3H3rBhojHE8wwg/4x1YAlxSpf+5UTOzo4BZwPtAZWTzdYQ+52z9jGId00iy8HMysz6EQc/mhAb04+7+60iMmALsBbwL/Mjd/13v8hpDQBcRkfprDF0uIiKSAgroIiI5QgFdRCRHKKCLiOQIBXQRkRyhgC4ikiMU0EVEcsT/B2VrxoZJxJBaAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "acc = history.history['accuracy']\n",
    "val_acc = history.history['val_accuracy']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "epochs = range(1, len(acc) + 1)\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.legend()\n",
    "plt.figure()\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
